// 服务端入口
import creatApp from './app'
// 服务端渲染可以返回一个函数
export default (ctx) => {
    return new Promise((res, rej) => {
        let {
            app,
            router,
            store
        } = creatApp();
        let {
            url
        } = ctx
        router.push(url);
        router.onReady(() => {
            const matchComponents = router.getMatchedComponents();
            if (matchComponents.length == 0) { //没有匹配到前端路由
                return rej({
                    code: 404
                });
            } else {
                Promise.all(matchComponents.map(component => {
                    if (component.asyncData) { // 服务端在渲染的时候 默认会找到页面级组件中的asyncData，并且在服务端也会创建一个vuex ，传递给asyncData
                        return component.asyncData(store)
                    }
                })).then(() => { // 会默认在window下生成一个变量 内部默认就这样做的
                    // "window.__INITIAL_STATE__={"name":"jiangwen"}"
                    context.state = store.state; //  服务器执行完毕后，最新的状态保存在store.state上
                    res(app); // app是已经获取到数据的实例
                }).catch(()=>{
                    rej()
                })
                //  res(app)
            }
        })
    }); // 每次都能产生一个新的应用
}